package com.example.tliasfight.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Slf4j
@Component//像很多比如说我要统计Controller层的所有的类和接口的所有方法的执行时间，你告诉我，你如果不把创建实例化对象的权力交给ioc容器，你怎么知道该怎么时候去创建该类的实例化对象呢
 // 因为运行Controller的时候我感觉很多东西（不是逻辑部分）是框架帮我做的，那这个统计用时用到的模板方法类创建对象的堆区交给框架或者ioc就很合理
//@Aspect//我感觉就是定义该类是一个模板方法类（AOP类）
public class TimeAspect
{@Pointcut
    @Around("execution(* com.example.tliasfight.controller.*.*(..))")//切入点表达式
    public Object recordTime1(ProceedingJoinPoint joinPoint) throws Throwable {
       long begin=System.currentTimeMillis();
       Object result=joinPoint.proceed();
       long end=System.currentTimeMillis();
       log.info(joinPoint.getSignature()+"方法耗费时间："+(end-begin)+"ms");
       return result;
    }

    @Before("execution(* com.example.tliasfight.controller.DeptController.*(..))")
    public void test1(JoinPoint joinPoint) {
     //   log.info("test2");
        //获取目标方法的类名
        log.info("目标方法的类名："+joinPoint.getTarget().getClass().getName());
        //获取目标方法的方法名
         log.info("目标方法的方法名："+joinPoint.getSignature().getName());
         //获取目标方法的参数
        log.info(Arrays.toString(joinPoint.getArgs()));

    }
    @Before("execution(* com.example.tliasfight.controller.DeptController.selectAll(..))")

    public void test2()
    {
         log.info("test1");
    }

}
